import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;

//定义进行多线程词频统计的程序
public class WordCountTest {
    public static void main(String[] args) {
        //定义存放要统计的文本
        String content = "我我我是中国人，我爱中国 我是一名教师";
        //定义存放中间结果的集合
        ArrayList midResult = new ArrayList();
        //定义子线程的数量
        final int nThread = 5;
        //定义存放所有子线程对象的数组
        WordCountThread[] threads = new WordCountThread[nThread];

        //根据设定的数量，创建子线程
        int avg = content.length() / nThread; //平均数
        for (int i = 0; i < nThread; i++) {
            //定义每个子线程需要进行词频统计的文本
            int start = i * avg;
            int end = (i + 1) * avg;
            //最后一个线程，分配的文本是一直到末尾
            if (i == nThread - 1) end = content.length();
            //int end = i < nThread - 1 ? (i + 1 ) * avg : content.length();
            String words = content.substring(start, end);
            System.out.println(words);
            WordCountThread thread = new WordCountThread(words, midResult);
            threads[i] = thread; //将创建的线程对象加到数组中
            thread.start(); //启动子线程
        }//end if

        //每个子线程都运行结束后，进行对中间结果的汇总
        for (WordCountThread thread : threads) {
            try {
                thread.join(); //等待每个子线程的结束
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        //对中间结果midResult里面的数据进行汇总
        //定义存放最终结果的集合
        HashMap<String, Integer> finalResult = new HashMap<String, Integer>();
        //遍历midResult中的每一个元素
        for (int i = 0; i < midResult.size(); i++) {
            HashMap<String, Integer> map = (HashMap<String, Integer>) midResult.get(i);  //get()从文件流中得到数据
            //遍历第i个中间结果中的数据
            for (Entry<String, Integer> entry : map.entrySet()) {
                String key = entry.getKey();
                int val = entry.getValue();
                if (finalResult.containsKey(key)) //最终结果中包含该字符
                    finalResult.put(key, finalResult.get(key) + val);
                else
                    finalResult.put(key, val);
            }
        }
        //输出最终结果
        for (Entry<String, Integer> entry : finalResult.entrySet()) {  //entryset 映射视图
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }

}
